home *** CD-ROM | disk | FTP | other *** search
- Encoding of Effective Addresses
-
- Unless you are concerned with the nitty-gritty details of 86
- instruction encoding, you don't need to read this file.
-
- Every instruction with an effective address has an encoded byte,
- known as the effective address byte, following the 1-byte opcode
- for the instruction. (For obscure reasons, Intel calls this byte
- the ModRM byte.) If the effective address is a memory variable,
- or an indexed memory location with a non-zero constant offset,
- then the effective address byte will be immediately followed by
- the offset amount. Amounts in the range -128 to +127 are given
- by a single signed byte, denoted by "d8" in the table below.
- Amounts requiring a 2-byte representation are denoted by "d16" in
- the table below. As with all 16-bit memory quantities in the 86
- family, the word is stored with the least significant byte FIRST.
-
- The following table of effective address byte values is organized
- into 32 rows and 8 columns. The 32 rows give the possible values
- for the effective address operand: 8 registers and 24 memory
- indexing modes. A 25th indexing mode, [BP] with zero
- displacement, has been pre-empted by the simple-memory-variable
- case. If you code [BP] with no displacement, you will get
- [BP]+d8, with a d8-value of zero.
-
- The 8 columns of the table reflect further information given by
- the effective address byte. Usually, this is the identity of the
- other (always a register) operand of a 2-operand instruction.
- Those instructions are identified by a "/r" following the opcode
- byte in the instruction list. Sometimes, the information given
- supplements the opcode byte in identifying the instruction
- itself. Those instructions are identified by a "/" followed by a
- digit from 0 through 7. The digit tells which of the 8 columns
- you should use to find the effective address byte.
-
- For example, suppose you have a perverse wish to know the precise
- bytes encoded by the instruction SUB B[BX+17],100. This
- instruction subtracts an immediate quantity, 100, from an
- effective address quantity, B[BX+17]. By consulting the
- instruction list, you find the general form SUB eb,ib. The
- opcode bytes given there are 80 /5 ib. The "/5" denotes an
- effective address byte, whose value will be taken from column 5
- of the following table. The offset 17 decimal, which is 11 hex,
- will fit in a single "d8" byte, so we take our value from the
- "[BX] + d8" row. The table tells us that the effective address
- byte is 6F. Immediately following the 6F is the offset, 11 hex.
- Following that is the ib-value of 100 decimal, which is 64 hex.
- So the bytes generated by SUB B[BX+17],100 are 80 6F 11 64.
-
- Table of Effective Address byte values
-
- s = ES CS SS DS
- rb = AL CL DL BL AH CH DH BH
- rw = AX CX DX BX SP BP SI DI
- digit= 0 1 2 3 4 5 6 7
- Effective
- EA byte address:
- values: 00 08 10 18 20 28 30 38 [BX + SI]
- 01 09 11 19 21 29 31 39 [BX + DI]
- 02 0A 12 1A 22 2A 32 3A [BP + SI]
- 03 0B 13 1B 23 2B 33 3B [BP + DI]
-
- 04 0C 14 1C 24 2C 34 3C [SI]
- 05 0D 15 1D 25 2D 35 3D [DI]
- 06 0E 16 1E 26 2E 36 3E d16 (simple var)
- 07 0F 17 1F 27 2F 37 3F [BX]
-
- 40 48 50 58 60 68 70 78 [BX + SI] + d8
- 41 49 51 59 61 69 71 79 [BX + DI] + d8
- 42 4A 52 5A 62 6A 72 7A [BP + SI] + d8
- 43 4B 53 5B 63 6B 73 7B [BP + DI] + d8
-
- 44 4C 54 5C 64 6C 74 7C [SI] + d8
- 45 4D 55 5D 65 6D 75 7D [DI] + d8
- 46 4E 56 5E 66 6E 76 7E [BP] + d8
- 47 4F 57 5F 67 6F 77 7F [BX] + d8
-
- 80 88 90 98 A0 A8 B0 B8 [BX + SI] + d16
- 81 89 91 99 A1 A9 B1 B9 [BX + DI] + d16
- 82 8A 92 9A A2 AA B2 BA [BP + SI] + d16
- 83 8B 93 9B A3 AB B3 BB [BP + DI] + d16
-
- 84 8C 94 9C A4 AC B4 BC [SI] + d16
- 85 8D 95 9D A5 AD B5 BD [DI] + d16
- 86 8E 96 9E A6 AE B6 BE [BP] + d16
- 87 8F 97 9F A7 AF B7 BF [BX] + d16
-
- C0 C8 D0 D8 E0 E8 F0 F8 ew=AX eb=AL
- C1 C9 D1 D9 E1 E9 F1 F9 ew=CX eb=CL
- C2 CA D2 DA E2 EA F2 FA ew=DX eb=DL
- C3 CB D3 DB E3 EB F3 FB ew=BX eb=BL
-
- C4 CC D4 DC E4 EC F4 FC ew=SP eb=AH
- C5 CD D5 DD E5 ED F5 FD ew=BP eb=CH
- C6 CE D6 DE E6 EE F6 FE ew=SI eb=DH
- C7 CF D7 DF E7 EF F7 FF ew=DI eb=BH
-
- d8 denotes an 8-bit displacement following the EA byte, to be
- sign-extended and added to the index.
-
- d16 denotes a 16-bit displacement following the EA byte, to be
- added to the index.
-
- Default segment register is SS for effective addresses containing
- a BP index; DS for other memory effective addresses.
-
-